using BepuUtilities;
using BepuUtilities.Memory;
using System.Runtime.CompilerServices;

namespace BepuPhysics.Constraints
{
    /// <summary>
    /// 将与约束关联的原始AOSOA格式数据存储在类型批处理中。
    /// </summary>
    public struct TypeBatch
    {
        // 注意：约束数据都是非类型化存储的。正确读取这些指针取决于用户。
        public RawBuffer BodyReferences;
        public RawBuffer PrestepData;
        public RawBuffer AccumulatedImpulses;
        // TODO：请注意,我们在这里仍然包含了一个投影缓冲区-尽管使用此结构的休眠孤岛永远不会为其分配空间,
        // 即使我们可能最终甚至不能持久化帧之间的分配。我们稍后可能会将其取出,并将其严格短暂地存储在求解器中。
        public RawBuffer Projection;
        public Buffer<ConstraintHandle> IndexToHandle;
        public int ConstraintCount;
        public int TypeId;

        public int BundleCount
        {
            [MethodImpl(MethodImplOptions.AggressiveInlining)]
            get
            {
                return BundleIndexing.GetBundleCount(ConstraintCount);
            }
        }

        public void Dispose(BufferPool pool)
        {
            pool.Return(ref Projection);
            pool.Return(ref BodyReferences);
            pool.Return(ref PrestepData);
            pool.Return(ref AccumulatedImpulses);
            pool.Return(ref IndexToHandle);
        }
    }
}
